In [1]:
# import libraries
import os
from PIL import Image
from torch.utils.data import Dataset, DataLoader
import numpy as np
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score, confusion_matrix
import matplotlib.pyplot as plt
import random
In [ ]:
# Set random seed
np.random.seed(42)
Place Pokemon PNG Files on a Randomly Selected Natural Background¶
In [2]:
POKE_DIR = r"pokemon_png"
BG_DIR = r"backgrounds"
OUT_DIR = r"pokemon_bg"
NUM_BGS = 1824 # only use the first 1824 backgrounds
FLIP_PROB = 0.5 # probability of horizontal flip
POKE_SCALE_MIN = 0.10 # 10% of bg width
POKE_SCALE_MAX = 0.40 # 40% of bg width
def main():
# Gather file lists
poke_files = sorted([f for f in os.listdir(POKE_DIR)
if f.lower().endswith('.png')])
bg_files = sorted([f for f in os.listdir(BG_DIR)
if f.lower().endswith(('.jpg','jpeg'))])[:NUM_BGS]
if not poke_files:
raise RuntimeError("No Pokémon PNGs found in pokemon_png/")
if not bg_files:
raise RuntimeError("No background JPGs found in backgrounds/")
# Prepare output directory
os.makedirs(OUT_DIR, exist_ok=True)
total = len(poke_files)
for i, poke_name in enumerate(poke_files, start=1):
# Load the Pokémon sprite (with alpha)
poke_path = os.path.join(POKE_DIR, poke_name)
poke = Image.open(poke_path).convert("RGBA")
# Random horizontal flip
if random.random() < FLIP_PROB:
poke = poke.transpose(Image.FLIP_LEFT_RIGHT)
# Pick & load a random background
bg_name = random.choice(bg_files)
bg_path = os.path.join(BG_DIR, bg_name)
bg = Image.open(bg_path).convert("RGBA")
bg_w, bg_h = bg.size
# Random scale
scale = random.uniform(POKE_SCALE_MIN, POKE_SCALE_MAX)
new_w = int(bg_w * scale)
# Keep aspect ratio
w0, h0 = poke.size
new_h = int(h0 * (new_w / w0))
poke = poke.resize((new_w, new_h), Image.LANCZOS)
# Random position
max_x = bg_w - new_w
max_y = bg_h - new_h
x = random.randint(0, max_x) if max_x > 0 else 0
y = random.randint(0, max_y) if max_y > 0 else 0
# Composite images
canvas = bg.copy()
canvas.alpha_composite(poke, (x, y))
# Save as JPEG
base, _ = os.path.splitext(poke_name)
out_name = f"{base}_bg.jpg"
out_path = os.path.join(OUT_DIR, out_name)
canvas.convert("RGB").save(out_path, "JPEG", quality=90)
print(f"[{i}/{total}] {poke_name} on {bg_name} → {out_name}")
if __name__ == "__main__":
main()
[1/819] 1.png on 00000040_(6).jpg → 1_bg.jpg [2/819] 10.png on 00000295_(3).jpg → 10_bg.jpg [3/819] 100.png on 00000128_(5).jpg → 100_bg.jpg [4/819] 101.png on 00000219_(3).jpg → 101_bg.jpg [5/819] 102.png on 00000101_(3).jpg → 102_bg.jpg [6/819] 103.png on 00000266_(2).jpg → 103_bg.jpg [7/819] 104.png on 00000274_(2).jpg → 104_bg.jpg [8/819] 105.png on 00000138_(5).jpg → 105_bg.jpg [9/819] 106.png on 00000247_(3).jpg → 106_bg.jpg [10/819] 107.png on 00000214_(2).jpg → 107_bg.jpg [11/819] 108.png on 00000171_(4).jpg → 108_bg.jpg [12/819] 109.png on 00000006.jpg → 109_bg.jpg [13/819] 11.png on 00000067_(7).jpg → 11_bg.jpg [14/819] 110.png on 00000024_(4).jpg → 110_bg.jpg [15/819] 111.png on 00000066_(6).jpg → 111_bg.jpg [16/819] 112.png on 00000149_(3).jpg → 112_bg.jpg [17/819] 113.png on 00000170_(5).jpg → 113_bg.jpg [18/819] 114.png on 00000278.jpg → 114_bg.jpg [19/819] 115-mega.png on 00000049.jpg → 115-mega_bg.jpg [20/819] 115.png on 00000300_(6).jpg → 115_bg.jpg [21/819] 116.png on 00000214_(3).jpg → 116_bg.jpg [22/819] 117.png on 00000116_(2).jpg → 117_bg.jpg [23/819] 118.png on 00000077_(6).jpg → 118_bg.jpg [24/819] 119.png on 00000110_(4).jpg → 119_bg.jpg [25/819] 12.png on 00000123_(4).jpg → 12_bg.jpg [26/819] 120.png on 00000296.jpg → 120_bg.jpg [27/819] 121.png on 00000178_(3).jpg → 121_bg.jpg [28/819] 122.png on 00000096_(4).jpg → 122_bg.jpg [29/819] 123.png on 00000020_(2).jpg → 123_bg.jpg [30/819] 124.png on 00000281_(5).jpg → 124_bg.jpg [31/819] 125.png on 00000143_(3).jpg → 125_bg.jpg [32/819] 126.png on 00000020_(5).jpg → 126_bg.jpg [33/819] 127-mega.png on 00000193_(3).jpg → 127-mega_bg.jpg [34/819] 127.png on 00000186_(2).jpg → 127_bg.jpg [35/819] 128.png on 00000148_(3).jpg → 128_bg.jpg [36/819] 129.png on 00000260_(3).jpg → 129_bg.jpg [37/819] 13.png on 00000133_(5).jpg → 13_bg.jpg [38/819] 130-mega.png on 00000272_(4).jpg → 130-mega_bg.jpg [39/819] 130.png on 00000024_(3).jpg → 130_bg.jpg [40/819] 131.png on 00000083_(3).jpg → 131_bg.jpg [41/819] 132.png on 00000239_(4).jpg → 132_bg.jpg [42/819] 133.png on 00000287_(3).jpg → 133_bg.jpg [43/819] 134.png on 00000145_(5).jpg → 134_bg.jpg [44/819] 135.png on 00000105_(3).jpg → 135_bg.jpg [45/819] 136.png on 00000055.jpg → 136_bg.jpg [46/819] 137.png on 00000270_(3).jpg → 137_bg.jpg [47/819] 138.png on 00000183_(6).jpg → 138_bg.jpg [48/819] 139.png on 00000219_(3).jpg → 139_bg.jpg [49/819] 14.png on 00000221_(3).jpg → 14_bg.jpg [50/819] 140.png on 00000124_(7).jpg → 140_bg.jpg [51/819] 141.png on 00000240_(4).jpg → 141_bg.jpg [52/819] 142-mega.png on 00000165_(3).jpg → 142-mega_bg.jpg [53/819] 142.png on 00000166_(2).jpg → 142_bg.jpg [54/819] 143.png on 00000217_(6).jpg → 143_bg.jpg [55/819] 144.png on 00000140_(2).jpg → 144_bg.jpg [56/819] 145.png on 00000009_(2).jpg → 145_bg.jpg [57/819] 146.png on 00000303_(3).jpg → 146_bg.jpg [58/819] 147.png on 00000091_(6).jpg → 147_bg.jpg [59/819] 148.png on 00000072_(2).jpg → 148_bg.jpg [60/819] 149.png on 00000044_(3).jpg → 149_bg.jpg [61/819] 15-mega.png on 00000069_(3).jpg → 15-mega_bg.jpg [62/819] 15.png on 00000240_(5).jpg → 15_bg.jpg [63/819] 150-mega-x.png on 00000035_(6).jpg → 150-mega-x_bg.jpg [64/819] 150-mega-y.png on 00000099_(4).jpg → 150-mega-y_bg.jpg [65/819] 150.png on 00000246.jpg → 150_bg.jpg [66/819] 151.png on 00000011_(4).jpg → 151_bg.jpg [67/819] 152.png on 00000037.jpg → 152_bg.jpg [68/819] 153.png on 00000030_(4).jpg → 153_bg.jpg [69/819] 154.png on 00000021_(2).jpg → 154_bg.jpg [70/819] 155.png on 00000212_(5).jpg → 155_bg.jpg [71/819] 156.png on 00000143.jpg → 156_bg.jpg [72/819] 157.png on 00000057_(7).jpg → 157_bg.jpg [73/819] 158.png on 00000050.jpg → 158_bg.jpg [74/819] 159.png on 00000121_(2).jpg → 159_bg.jpg [75/819] 16.png on 00000211_(6).jpg → 16_bg.jpg [76/819] 160.png on 00000011_(2).jpg → 160_bg.jpg [77/819] 161.png on 00000156_(2).jpg → 161_bg.jpg [78/819] 162.png on 00000277_(2).jpg → 162_bg.jpg [79/819] 163.png on 00000020_(5).jpg → 163_bg.jpg [80/819] 164.png on 00000137_(5).jpg → 164_bg.jpg [81/819] 165.png on 00000251_(6).jpg → 165_bg.jpg [82/819] 166.png on 00000062_(2).jpg → 166_bg.jpg [83/819] 167.png on 00000262.jpg → 167_bg.jpg [84/819] 168.png on 00000271_(2).jpg → 168_bg.jpg [85/819] 169.png on 00000111_(5).jpg → 169_bg.jpg [86/819] 17.png on 00000206_(6).jpg → 17_bg.jpg [87/819] 170.png on 00000084_(6).jpg → 170_bg.jpg [88/819] 171.png on 00000237_(6).jpg → 171_bg.jpg [89/819] 172.png on 00000269_(6).jpg → 172_bg.jpg [90/819] 173.png on 00000125_(5).jpg → 173_bg.jpg [91/819] 174.png on 00000071_(3).jpg → 174_bg.jpg [92/819] 175.png on 00000221_(2).jpg → 175_bg.jpg [93/819] 176.png on 00000229_(2).jpg → 176_bg.jpg [94/819] 177.png on 00000142_(5).jpg → 177_bg.jpg [95/819] 178.png on 00000112.jpg → 178_bg.jpg [96/819] 179.png on 00000150_(3).jpg → 179_bg.jpg [97/819] 18-mega.png on 00000214_(2).jpg → 18-mega_bg.jpg [98/819] 18.png on 00000174_(2).jpg → 18_bg.jpg [99/819] 180.png on 00000018_(6).jpg → 180_bg.jpg [100/819] 181-mega.png on 00000172_(5).jpg → 181-mega_bg.jpg [101/819] 181.png on 00000095_(4).jpg → 181_bg.jpg [102/819] 182.png on 00000245_(6).jpg → 182_bg.jpg [103/819] 183.png on 00000017_(5).jpg → 183_bg.jpg [104/819] 184.png on 00000244_(6).jpg → 184_bg.jpg [105/819] 185.png on 00000227_(3).jpg → 185_bg.jpg [106/819] 186.png on 00000125_(3).jpg → 186_bg.jpg [107/819] 187.png on 00000072.jpg → 187_bg.jpg [108/819] 188.png on 00000057_(6).jpg → 188_bg.jpg [109/819] 189.png on 00000293_(3).jpg → 189_bg.jpg [110/819] 19.png on 00000088_(5).jpg → 19_bg.jpg [111/819] 190.png on 00000163_(5).jpg → 190_bg.jpg [112/819] 191.png on 00000045.jpg → 191_bg.jpg [113/819] 192.png on 00000193_(5).jpg → 192_bg.jpg [114/819] 193.png on 00000045_(5).jpg → 193_bg.jpg [115/819] 194.png on 00000004_(2).jpg → 194_bg.jpg [116/819] 195.png on 00000202_(4).jpg → 195_bg.jpg [117/819] 196.png on 00000110.jpg → 196_bg.jpg [118/819] 197.png on 00000061_(2).jpg → 197_bg.jpg [119/819] 198.png on 00000150_(2).jpg → 198_bg.jpg [120/819] 199.png on 00000237_(4).jpg → 199_bg.jpg [121/819] 2.png on 00000123_(2).jpg → 2_bg.jpg [122/819] 20.png on 00000291_(3).jpg → 20_bg.jpg [123/819] 200.png on 00000096_(2).jpg → 200_bg.jpg [124/819] 201-f.png on 00000250_(2).jpg → 201-f_bg.jpg [125/819] 202.png on 00000035.jpg → 202_bg.jpg [126/819] 203.png on 00000288_(2).jpg → 203_bg.jpg [127/819] 204.png on 00000153_(6).jpg → 204_bg.jpg [128/819] 205.png on 00000204_(5).jpg → 205_bg.jpg [129/819] 206.png on 00000099.jpg → 206_bg.jpg [130/819] 207.png on 00000156_(3).jpg → 207_bg.jpg [131/819] 208-mega.png on 00000258_(5).jpg → 208-mega_bg.jpg [132/819] 208.png on 00000080_(4).jpg → 208_bg.jpg [133/819] 209.png on 00000247_(4).jpg → 209_bg.jpg [134/819] 21.png on 00000221_(4).jpg → 21_bg.jpg [135/819] 210.png on 00000031_(6).jpg → 210_bg.jpg [136/819] 211.png on 00000121_(2).jpg → 211_bg.jpg [137/819] 212-mega.png on 00000045_(5).jpg → 212-mega_bg.jpg [138/819] 212.png on 00000235_(5).jpg → 212_bg.jpg [139/819] 213.png on 00000222_(6).jpg → 213_bg.jpg [140/819] 214-mega.png on 00000243_(2).jpg → 214-mega_bg.jpg [141/819] 214.png on 00000074.jpg → 214_bg.jpg [142/819] 215.png on 00000025_(5).jpg → 215_bg.jpg [143/819] 216.png on 00000025_(2).jpg → 216_bg.jpg [144/819] 217.png on 00000172_(6).jpg → 217_bg.jpg [145/819] 218.png on 00000095_(2).jpg → 218_bg.jpg [146/819] 219.png on 00000302.jpg → 219_bg.jpg [147/819] 22.png on 00000206_(6).jpg → 22_bg.jpg [148/819] 220.png on 00000165_(2).jpg → 220_bg.jpg [149/819] 221.png on 00000005_(4).jpg → 221_bg.jpg [150/819] 222.png on 00000018_(2).jpg → 222_bg.jpg [151/819] 223.png on 00000250_(2).jpg → 223_bg.jpg [152/819] 224.png on 00000012_(5).jpg → 224_bg.jpg [153/819] 225.png on 00000073_(6).jpg → 225_bg.jpg [154/819] 226.png on 00000057_(5).jpg → 226_bg.jpg [155/819] 227.png on 00000036_(2).jpg → 227_bg.jpg [156/819] 228.png on 00000003_(3).jpg → 228_bg.jpg [157/819] 229-mega.png on 00000135_(5).jpg → 229-mega_bg.jpg [158/819] 229.png on 00000285_(4).jpg → 229_bg.jpg [159/819] 23.png on 00000059_(5).jpg → 23_bg.jpg [160/819] 230.png on 00000102_(4).jpg → 230_bg.jpg [161/819] 231.png on 00000230_(6).jpg → 231_bg.jpg [162/819] 232.png on 00000005_(2).jpg → 232_bg.jpg [163/819] 233.png on 00000189_(2).jpg → 233_bg.jpg [164/819] 234.png on 00000103.jpg → 234_bg.jpg [165/819] 235.png on 00000060.jpg → 235_bg.jpg [166/819] 236.png on 00000018_(4).jpg → 236_bg.jpg [167/819] 237.png on 00000021_(7).jpg → 237_bg.jpg [168/819] 238.png on 00000231_(5).jpg → 238_bg.jpg [169/819] 239.png on 00000099_(3).jpg → 239_bg.jpg [170/819] 24.png on 00000097_(2).jpg → 24_bg.jpg [171/819] 240.png on 00000151_(3).jpg → 240_bg.jpg [172/819] 241.png on 00000227_(2).jpg → 241_bg.jpg [173/819] 242.png on 00000067.jpg → 242_bg.jpg [174/819] 243.png on 00000032_(5).jpg → 243_bg.jpg [175/819] 244.png on 00000192_(2).jpg → 244_bg.jpg [176/819] 245.png on 00000091_(4).jpg → 245_bg.jpg [177/819] 246.png on 00000045_(6).jpg → 246_bg.jpg [178/819] 247.png on 00000101_(7).jpg → 247_bg.jpg [179/819] 248-mega.png on 00000028_(3).jpg → 248-mega_bg.jpg [180/819] 248.png on 00000171_(3).jpg → 248_bg.jpg [181/819] 249.png on 00000139_(5).jpg → 249_bg.jpg [182/819] 25-belle.png on 00000031_(4).jpg → 25-belle_bg.jpg [183/819] 25-libre.png on 00000207_(2).jpg → 25-libre_bg.jpg [184/819] 25-phd.png on 00000150_(6).jpg → 25-phd_bg.jpg [185/819] 25-pop-star.png on 00000133_(4).jpg → 25-pop-star_bg.jpg [186/819] 25-rock-star.png on 00000011_(7).jpg → 25-rock-star_bg.jpg [187/819] 25.png on 00000007_(6).jpg → 25_bg.jpg [188/819] 250.png on 00000037_(2).jpg → 250_bg.jpg [189/819] 251.png on 00000198_(3).jpg → 251_bg.jpg [190/819] 252.png on 00000169_(6).jpg → 252_bg.jpg [191/819] 253.png on 00000294_(6).jpg → 253_bg.jpg [192/819] 254-mega.png on 00000078.jpg → 254-mega_bg.jpg [193/819] 254.png on 00000160_(3).jpg → 254_bg.jpg [194/819] 255.png on 00000267_(2).jpg → 255_bg.jpg [195/819] 256.png on 00000107_(4).jpg → 256_bg.jpg [196/819] 257-mega.png on 00000023_(4).jpg → 257-mega_bg.jpg [197/819] 257.png on 00000083_(2).jpg → 257_bg.jpg [198/819] 258.png on 00000191_(4).jpg → 258_bg.jpg [199/819] 259.png on 00000057_(5).jpg → 259_bg.jpg [200/819] 26.png on 00000179_(4).jpg → 26_bg.jpg [201/819] 260-mega.png on 00000203_(5).jpg → 260-mega_bg.jpg [202/819] 260.png on 00000046_(3).jpg → 260_bg.jpg [203/819] 261.png on 00000026_(4).jpg → 261_bg.jpg [204/819] 262.png on 00000051_(2).jpg → 262_bg.jpg [205/819] 263.png on 00000180_(5).jpg → 263_bg.jpg [206/819] 264.png on 00000266_(5).jpg → 264_bg.jpg [207/819] 265.png on 00000193_(4).jpg → 265_bg.jpg [208/819] 266.png on 00000038_(6).jpg → 266_bg.jpg [209/819] 267.png on 00000074_(3).jpg → 267_bg.jpg [210/819] 268.png on 00000174_(6).jpg → 268_bg.jpg [211/819] 269.png on 00000253_(2).jpg → 269_bg.jpg [212/819] 27.png on 00000144_(6).jpg → 27_bg.jpg [213/819] 270.png on 00000118_(3).jpg → 270_bg.jpg [214/819] 271.png on 00000011_(5).jpg → 271_bg.jpg [215/819] 272.png on 00000301_(4).jpg → 272_bg.jpg [216/819] 273.png on 00000042_(7).jpg → 273_bg.jpg [217/819] 274.png on 00000173_(4).jpg → 274_bg.jpg [218/819] 275.png on 00000184_(2).jpg → 275_bg.jpg [219/819] 276.png on 00000173_(4).jpg → 276_bg.jpg [220/819] 277.png on 00000091_(6).jpg → 277_bg.jpg [221/819] 278.png on 00000271_(6).jpg → 278_bg.jpg [222/819] 279.png on 00000245_(6).jpg → 279_bg.jpg [223/819] 28.png on 00000164_(3).jpg → 28_bg.jpg [224/819] 280.png on 00000217_(3).jpg → 280_bg.jpg [225/819] 281.png on 00000281_(2).jpg → 281_bg.jpg [226/819] 282-mega.png on 00000172.jpg → 282-mega_bg.jpg [227/819] 282.png on 00000089_(4).jpg → 282_bg.jpg [228/819] 283.png on 00000301_(5).jpg → 283_bg.jpg [229/819] 284.png on 00000035_(6).jpg → 284_bg.jpg [230/819] 285.png on 00000067_(7).jpg → 285_bg.jpg [231/819] 286.png on 00000038_(2).jpg → 286_bg.jpg [232/819] 287.png on 00000070_(4).jpg → 287_bg.jpg [233/819] 288.png on 00000001_(4).jpg → 288_bg.jpg [234/819] 289.png on 00000022_(3).jpg → 289_bg.jpg [235/819] 29.png on 00000221_(3).jpg → 29_bg.jpg [236/819] 290.png on 00000216_(6).jpg → 290_bg.jpg [237/819] 291.png on 00000284_(4).jpg → 291_bg.jpg [238/819] 292.png on 00000010_(7).jpg → 292_bg.jpg [239/819] 293.png on 00000293_(3).jpg → 293_bg.jpg [240/819] 294.png on 00000205_(2).jpg → 294_bg.jpg [241/819] 295.png on 00000126_(7).jpg → 295_bg.jpg [242/819] 296.png on 00000228_(4).jpg → 296_bg.jpg [243/819] 297.png on 00000263_(3).jpg → 297_bg.jpg [244/819] 298.png on 00000234_(6).jpg → 298_bg.jpg [245/819] 299.png on 00000239_(6).jpg → 299_bg.jpg [246/819] 3-mega.png on 00000195_(4).jpg → 3-mega_bg.jpg [247/819] 3.png on 00000277_(5).jpg → 3_bg.jpg [248/819] 30.png on 00000105_(4).jpg → 30_bg.jpg [249/819] 300.png on 00000121_(7).jpg → 300_bg.jpg [250/819] 301.png on 00000135_(6).jpg → 301_bg.jpg [251/819] 302-mega.png on 00000217_(6).jpg → 302-mega_bg.jpg [252/819] 302.png on 00000149_(6).jpg → 302_bg.jpg [253/819] 303-mega.png on 00000111_(6).jpg → 303-mega_bg.jpg [254/819] 303.png on 00000181_(4).jpg → 303_bg.jpg [255/819] 304.png on 00000229.jpg → 304_bg.jpg [256/819] 305.png on 00000142_(4).jpg → 305_bg.jpg [257/819] 306-mega.png on 00000155_(5).jpg → 306-mega_bg.jpg [258/819] 306.png on 00000135_(6).jpg → 306_bg.jpg [259/819] 307.png on 00000287_(2).jpg → 307_bg.jpg [260/819] 308-mega.png on 00000087_(4).jpg → 308-mega_bg.jpg [261/819] 308.png on 00000253_(4).jpg → 308_bg.jpg [262/819] 309.png on 00000013_(2).jpg → 309_bg.jpg [263/819] 31.png on 00000008.jpg → 31_bg.jpg [264/819] 310-mega.png on 00000134_(4).jpg → 310-mega_bg.jpg [265/819] 310.png on 00000230_(4).jpg → 310_bg.jpg [266/819] 311.png on 00000235_(2).jpg → 311_bg.jpg [267/819] 312.png on 00000039_(5).jpg → 312_bg.jpg [268/819] 313.png on 00000192_(3).jpg → 313_bg.jpg [269/819] 314.png on 00000077_(4).jpg → 314_bg.jpg [270/819] 315.png on 00000115_(2).jpg → 315_bg.jpg [271/819] 316.png on 00000183_(4).jpg → 316_bg.jpg [272/819] 317.png on 00000002_(6).jpg → 317_bg.jpg [273/819] 318.png on 00000041_(4).jpg → 318_bg.jpg [274/819] 319-mega.png on 00000022.jpg → 319-mega_bg.jpg [275/819] 319.png on 00000151_(6).jpg → 319_bg.jpg [276/819] 32.png on 00000075.jpg → 32_bg.jpg [277/819] 320.png on 00000163_(5).jpg → 320_bg.jpg [278/819] 321.png on 00000001_(4).jpg → 321_bg.jpg [279/819] 322.png on 00000016.jpg → 322_bg.jpg [280/819] 323-mega.png on 00000070_(6).jpg → 323-mega_bg.jpg [281/819] 323.png on 00000056_(5).jpg → 323_bg.jpg [282/819] 324.png on 00000238_(2).jpg → 324_bg.jpg [283/819] 325.png on 00000044_(3).jpg → 325_bg.jpg [284/819] 326.png on 00000192_(4).jpg → 326_bg.jpg [285/819] 327.png on 00000210_(3).jpg → 327_bg.jpg [286/819] 328.png on 00000163_(3).jpg → 328_bg.jpg [287/819] 329.png on 00000293_(2).jpg → 329_bg.jpg [288/819] 33.png on 00000185_(2).jpg → 33_bg.jpg [289/819] 330.png on 00000098_(3).jpg → 330_bg.jpg [290/819] 331.png on 00000187_(4).jpg → 331_bg.jpg [291/819] 332.png on 00000101_(3).jpg → 332_bg.jpg [292/819] 333.png on 00000153_(5).jpg → 333_bg.jpg [293/819] 334-mega.png on 00000053_(5).jpg → 334-mega_bg.jpg [294/819] 334.png on 00000258_(3).jpg → 334_bg.jpg [295/819] 335.png on 00000105_(6).jpg → 335_bg.jpg [296/819] 336.png on 00000268_(4).jpg → 336_bg.jpg [297/819] 337.png on 00000109_(5).jpg → 337_bg.jpg [298/819] 338.png on 00000235_(2).jpg → 338_bg.jpg [299/819] 339.png on 00000152_(2).jpg → 339_bg.jpg [300/819] 34.png on 00000020_(2).jpg → 34_bg.jpg [301/819] 340.png on 00000210_(2).jpg → 340_bg.jpg [302/819] 341.png on 00000212_(2).jpg → 341_bg.jpg [303/819] 342.png on 00000114_(3).jpg → 342_bg.jpg [304/819] 343.png on 00000019_(3).jpg → 343_bg.jpg [305/819] 344.png on 00000197_(3).jpg → 344_bg.jpg [306/819] 345.png on 00000073_(2).jpg → 345_bg.jpg [307/819] 346.png on 00000133.jpg → 346_bg.jpg [308/819] 347.png on 00000017_(5).jpg → 347_bg.jpg [309/819] 348.png on 00000091_(5).jpg → 348_bg.jpg [310/819] 349.png on 00000117_(4).jpg → 349_bg.jpg [311/819] 35.png on 00000048_(2).jpg → 35_bg.jpg [312/819] 350.png on 00000070_(5).jpg → 350_bg.jpg [313/819] 351.png on 00000111_(3).jpg → 351_bg.jpg [314/819] 352.png on 00000206_(6).jpg → 352_bg.jpg [315/819] 353.png on 00000026.jpg → 353_bg.jpg [316/819] 354-mega.png on 00000110_(5).jpg → 354-mega_bg.jpg [317/819] 354.png on 00000289_(3).jpg → 354_bg.jpg [318/819] 355.png on 00000189_(5).jpg → 355_bg.jpg [319/819] 356.png on 00000290_(3).jpg → 356_bg.jpg [320/819] 357.png on 00000209_(5).jpg → 357_bg.jpg [321/819] 358.png on 00000148_(4).jpg → 358_bg.jpg [322/819] 359-mega.png on 00000228.jpg → 359-mega_bg.jpg [323/819] 359.png on 00000171_(6).jpg → 359_bg.jpg [324/819] 36.png on 00000152_(3).jpg → 36_bg.jpg [325/819] 360.png on 00000270_(6).jpg → 360_bg.jpg [326/819] 361.png on 00000020_(5).jpg → 361_bg.jpg [327/819] 362-mega.png on 00000208_(3).jpg → 362-mega_bg.jpg [328/819] 362.png on 00000150_(5).jpg → 362_bg.jpg [329/819] 363.png on 00000193_(6).jpg → 363_bg.jpg [330/819] 364.png on 00000253_(3).jpg → 364_bg.jpg [331/819] 365.png on 00000062_(3).jpg → 365_bg.jpg [332/819] 366.png on 00000065_(5).jpg → 366_bg.jpg [333/819] 367.png on 00000024_(6).jpg → 367_bg.jpg [334/819] 368.png on 00000061_(5).jpg → 368_bg.jpg [335/819] 369.png on 00000205_(3).jpg → 369_bg.jpg [336/819] 37.png on 00000244.jpg → 37_bg.jpg [337/819] 370.png on 00000003_(2).jpg → 370_bg.jpg [338/819] 371.png on 00000156_(2).jpg → 371_bg.jpg [339/819] 372.png on 00000148_(5).jpg → 372_bg.jpg [340/819] 373-mega.png on 00000137_(2).jpg → 373-mega_bg.jpg [341/819] 373.png on 00000094.jpg → 373_bg.jpg [342/819] 374.png on 00000157.jpg → 374_bg.jpg [343/819] 375.png on 00000031_(4).jpg → 375_bg.jpg [344/819] 376-mega.png on 00000256.jpg → 376-mega_bg.jpg [345/819] 376.png on 00000221_(5).jpg → 376_bg.jpg [346/819] 377.png on 00000096_(6).jpg → 377_bg.jpg [347/819] 378.png on 00000082_(3).jpg → 378_bg.jpg [348/819] 379.png on 00000073_(6).jpg → 379_bg.jpg [349/819] 38.png on 00000228_(6).jpg → 38_bg.jpg [350/819] 380-mega.png on 00000203_(5).jpg → 380-mega_bg.jpg [351/819] 380.png on 00000281.jpg → 380_bg.jpg [352/819] 381-mega.png on 00000013_(6).jpg → 381-mega_bg.jpg [353/819] 381.png on 00000170_(6).jpg → 381_bg.jpg [354/819] 382-primal.png on 00000291_(5).jpg → 382-primal_bg.jpg [355/819] 382.png on 00000017_(6).jpg → 382_bg.jpg [356/819] 383-primal.png on 00000079_(3).jpg → 383-primal_bg.jpg [357/819] 383.png on 00000069_(6).jpg → 383_bg.jpg [358/819] 384-mega.png on 00000195_(6).jpg → 384-mega_bg.jpg [359/819] 384.png on 00000055_(6).jpg → 384_bg.jpg [360/819] 385.png on 00000126_(5).jpg → 385_bg.jpg [361/819] 386-attack.png on 00000023_(2).jpg → 386-attack_bg.jpg [362/819] 386-defense.png on 00000256_(3).jpg → 386-defense_bg.jpg [363/819] 386-normal.png on 00000279_(6).jpg → 386-normal_bg.jpg [364/819] 386-speed.png on 00000005_(3).jpg → 386-speed_bg.jpg [365/819] 387.png on 00000126_(3).jpg → 387_bg.jpg [366/819] 388.png on 00000047_(7).jpg → 388_bg.jpg [367/819] 389.png on 00000092_(2).jpg → 389_bg.jpg [368/819] 39.png on 00000110_(5).jpg → 39_bg.jpg [369/819] 390.png on 00000029_(6).jpg → 390_bg.jpg [370/819] 391.png on 00000014_(2).jpg → 391_bg.jpg [371/819] 392.png on 00000042_(2).jpg → 392_bg.jpg [372/819] 393.png on 00000152_(2).jpg → 393_bg.jpg [373/819] 394.png on 00000260_(6).jpg → 394_bg.jpg [374/819] 395.png on 00000294.jpg → 395_bg.jpg [375/819] 396.png on 00000228_(6).jpg → 396_bg.jpg [376/819] 397.png on 00000130.jpg → 397_bg.jpg [377/819] 398.png on 00000062.jpg → 398_bg.jpg [378/819] 399.png on 00000281_(6).jpg → 399_bg.jpg [379/819] 4.png on 00000278_(6).jpg → 4_bg.jpg [380/819] 40.png on 00000243_(2).jpg → 40_bg.jpg [381/819] 400.png on 00000056_(5).jpg → 400_bg.jpg [382/819] 401.png on 00000279_(5).jpg → 401_bg.jpg [383/819] 402.png on 00000135_(4).jpg → 402_bg.jpg [384/819] 403.png on 00000218_(2).jpg → 403_bg.jpg [385/819] 404.png on 00000093_(2).jpg → 404_bg.jpg [386/819] 405.png on 00000259_(3).jpg → 405_bg.jpg [387/819] 406.png on 00000164_(5).jpg → 406_bg.jpg [388/819] 407.png on 00000112_(5).jpg → 407_bg.jpg [389/819] 408.png on 00000227.jpg → 408_bg.jpg [390/819] 409.png on 00000186_(2).jpg → 409_bg.jpg [391/819] 41.png on 00000083_(5).jpg → 41_bg.jpg [392/819] 410.png on 00000169.jpg → 410_bg.jpg [393/819] 411.png on 00000108_(4).jpg → 411_bg.jpg [394/819] 412-plant.png on 00000255_(6).jpg → 412-plant_bg.jpg [395/819] 412-sandy.png on 00000137_(2).jpg → 412-sandy_bg.jpg [396/819] 412-trash.png on 00000014.jpg → 412-trash_bg.jpg [397/819] 413-plant.png on 00000131_(4).jpg → 413-plant_bg.jpg [398/819] 413-sandy.png on 00000137_(3).jpg → 413-sandy_bg.jpg [399/819] 413-trash.png on 00000076.jpg → 413-trash_bg.jpg [400/819] 414.png on 00000117_(4).jpg → 414_bg.jpg [401/819] 415.png on 00000279_(4).jpg → 415_bg.jpg [402/819] 416.png on 00000244_(6).jpg → 416_bg.jpg [403/819] 417.png on 00000064_(4).jpg → 417_bg.jpg [404/819] 418.png on 00000069_(2).jpg → 418_bg.jpg [405/819] 419.png on 00000296_(5).jpg → 419_bg.jpg [406/819] 42.png on 00000165_(3).jpg → 42_bg.jpg [407/819] 420.png on 00000227_(5).jpg → 420_bg.jpg [408/819] 421-overcast.png on 00000247_(2).jpg → 421-overcast_bg.jpg [409/819] 421-sunshine.png on 00000092_(4).jpg → 421-sunshine_bg.jpg [410/819] 422-east.png on 00000051_(3).jpg → 422-east_bg.jpg [411/819] 422-west.png on 00000276_(3).jpg → 422-west_bg.jpg [412/819] 423-east.png on 00000050_(4).jpg → 423-east_bg.jpg [413/819] 423-west.png on 00000298_(3).jpg → 423-west_bg.jpg [414/819] 424.png on 00000067_(3).jpg → 424_bg.jpg [415/819] 425.png on 00000073_(2).jpg → 425_bg.jpg [416/819] 426.png on 00000107_(7).jpg → 426_bg.jpg [417/819] 427.png on 00000301_(6).jpg → 427_bg.jpg [418/819] 428-mega.png on 00000196_(2).jpg → 428-mega_bg.jpg [419/819] 428.png on 00000267_(2).jpg → 428_bg.jpg [420/819] 429.png on 00000000.jpg → 429_bg.jpg [421/819] 43.png on 00000274_(3).jpg → 43_bg.jpg [422/819] 430.png on 00000103_(5).jpg → 430_bg.jpg [423/819] 431.png on 00000199_(2).jpg → 431_bg.jpg [424/819] 432.png on 00000094_(3).jpg → 432_bg.jpg [425/819] 433.png on 00000142_(2).jpg → 433_bg.jpg [426/819] 434.png on 00000278.jpg → 434_bg.jpg [427/819] 435.png on 00000082_(5).jpg → 435_bg.jpg [428/819] 436.png on 00000058_(5).jpg → 436_bg.jpg [429/819] 437.png on 00000018.jpg → 437_bg.jpg [430/819] 438.png on 00000136_(6).jpg → 438_bg.jpg [431/819] 439.png on 00000128_(3).jpg → 439_bg.jpg [432/819] 44.png on 00000245_(2).jpg → 44_bg.jpg [433/819] 440.png on 00000301_(6).jpg → 440_bg.jpg [434/819] 441.png on 00000066_(4).jpg → 441_bg.jpg [435/819] 442.png on 00000170_(3).jpg → 442_bg.jpg [436/819] 443.png on 00000247_(2).jpg → 443_bg.jpg [437/819] 444.png on 00000287_(4).jpg → 444_bg.jpg [438/819] 445-mega.png on 00000262.jpg → 445-mega_bg.jpg [439/819] 445.png on 00000300_(6).jpg → 445_bg.jpg [440/819] 446.png on 00000191_(4).jpg → 446_bg.jpg [441/819] 447.png on 00000238_(6).jpg → 447_bg.jpg [442/819] 448-mega.png on 00000020_(3).jpg → 448-mega_bg.jpg [443/819] 448.png on 00000255_(4).jpg → 448_bg.jpg [444/819] 449.png on 00000169_(6).jpg → 449_bg.jpg [445/819] 45.png on 00000112_(3).jpg → 45_bg.jpg [446/819] 450.png on 00000166_(5).jpg → 450_bg.jpg [447/819] 451.png on 00000050.jpg → 451_bg.jpg [448/819] 452.png on 00000225_(2).jpg → 452_bg.jpg [449/819] 453.png on 00000044_(6).jpg → 453_bg.jpg [450/819] 454.png on 00000067_(5).jpg → 454_bg.jpg [451/819] 455.png on 00000301_(2).jpg → 455_bg.jpg [452/819] 456.png on 00000016.jpg → 456_bg.jpg [453/819] 457.png on 00000133_(2).jpg → 457_bg.jpg [454/819] 458.png on 00000286_(4).jpg → 458_bg.jpg [455/819] 459.png on 00000188_(3).jpg → 459_bg.jpg [456/819] 46.png on 00000261_(6).jpg → 46_bg.jpg [457/819] 460-mega.png on 00000226_(2).jpg → 460-mega_bg.jpg [458/819] 460.png on 00000122.jpg → 460_bg.jpg [459/819] 461.png on 00000181_(3).jpg → 461_bg.jpg [460/819] 462.png on 00000189_(3).jpg → 462_bg.jpg [461/819] 463.png on 00000291_(3).jpg → 463_bg.jpg [462/819] 464.png on 00000172_(3).jpg → 464_bg.jpg [463/819] 465.png on 00000088_(6).jpg → 465_bg.jpg [464/819] 466.png on 00000252_(4).jpg → 466_bg.jpg [465/819] 467.png on 00000001.jpg → 467_bg.jpg [466/819] 468.png on 00000028.jpg → 468_bg.jpg [467/819] 469.png on 00000097_(2).jpg → 469_bg.jpg [468/819] 47.png on 00000194.jpg → 47_bg.jpg [469/819] 470.png on 00000189_(5).jpg → 470_bg.jpg [470/819] 471.png on 00000143_(6).jpg → 471_bg.jpg [471/819] 472.png on 00000269_(6).jpg → 472_bg.jpg [472/819] 473.png on 00000199_(5).jpg → 473_bg.jpg [473/819] 474.png on 00000079_(4).jpg → 474_bg.jpg [474/819] 475-mega.png on 00000152_(5).jpg → 475-mega_bg.jpg [475/819] 475.png on 00000058.jpg → 475_bg.jpg [476/819] 476.png on 00000227_(6).jpg → 476_bg.jpg [477/819] 477.png on 00000207_(2).jpg → 477_bg.jpg [478/819] 478.png on 00000061_(6).jpg → 478_bg.jpg [479/819] 479-fan.png on 00000194_(3).jpg → 479-fan_bg.jpg [480/819] 479-frost.png on 00000042_(3).jpg → 479-frost_bg.jpg [481/819] 479-heat.png on 00000104.jpg → 479-heat_bg.jpg [482/819] 479-mow.png on 00000187.jpg → 479-mow_bg.jpg [483/819] 479-wash.png on 00000299_(2).jpg → 479-wash_bg.jpg [484/819] 479.png on 00000176_(6).jpg → 479_bg.jpg [485/819] 48.png on 00000111_(2).jpg → 48_bg.jpg [486/819] 480.png on 00000127.jpg → 480_bg.jpg [487/819] 481.png on 00000113_(4).jpg → 481_bg.jpg [488/819] 482.png on 00000221_(6).jpg → 482_bg.jpg [489/819] 483.png on 00000017_(7).jpg → 483_bg.jpg [490/819] 484.png on 00000159_(4).jpg → 484_bg.jpg [491/819] 485.png on 00000247_(6).jpg → 485_bg.jpg [492/819] 486.png on 00000180_(2).jpg → 486_bg.jpg [493/819] 487-altered.png on 00000255_(2).jpg → 487-altered_bg.jpg [494/819] 487-origin.png on 00000033_(3).jpg → 487-origin_bg.jpg [495/819] 488.png on 00000197_(2).jpg → 488_bg.jpg [496/819] 489.png on 00000137_(2).jpg → 489_bg.jpg [497/819] 49.png on 00000101_(5).jpg → 49_bg.jpg [498/819] 490.png on 00000038_(2).jpg → 490_bg.jpg [499/819] 491.png on 00000097_(4).jpg → 491_bg.jpg [500/819] 492-land.png on 00000002_(3).jpg → 492-land_bg.jpg [501/819] 492-sky.png on 00000075_(6).jpg → 492-sky_bg.jpg [502/819] 493-normal.png on 00000202_(4).jpg → 493-normal_bg.jpg [503/819] 494.png on 00000269_(2).jpg → 494_bg.jpg [504/819] 495.png on 00000085.jpg → 495_bg.jpg [505/819] 496.png on 00000092_(6).jpg → 496_bg.jpg [506/819] 497.png on 00000085_(5).jpg → 497_bg.jpg [507/819] 498.png on 00000106.jpg → 498_bg.jpg [508/819] 499.png on 00000166_(6).jpg → 499_bg.jpg [509/819] 5.png on 00000049_(4).jpg → 5_bg.jpg [510/819] 50.png on 00000303_(3).jpg → 50_bg.jpg [511/819] 500.png on 00000119_(6).jpg → 500_bg.jpg [512/819] 501.png on 00000111_(6).jpg → 501_bg.jpg [513/819] 502.png on 00000078_(2).jpg → 502_bg.jpg [514/819] 503.png on 00000156_(5).jpg → 503_bg.jpg [515/819] 504.png on 00000088_(3).jpg → 504_bg.jpg [516/819] 505.png on 00000038_(4).jpg → 505_bg.jpg [517/819] 506.png on 00000151_(3).jpg → 506_bg.jpg [518/819] 507.png on 00000064_(7).jpg → 507_bg.jpg [519/819] 508.png on 00000159_(5).jpg → 508_bg.jpg [520/819] 509.png on 00000041_(5).jpg → 509_bg.jpg [521/819] 51.png on 00000237.jpg → 51_bg.jpg [522/819] 510.png on 00000013_(5).jpg → 510_bg.jpg [523/819] 511.png on 00000118_(4).jpg → 511_bg.jpg [524/819] 512.png on 00000128_(4).jpg → 512_bg.jpg [525/819] 513.png on 00000068_(6).jpg → 513_bg.jpg [526/819] 514.png on 00000053_(4).jpg → 514_bg.jpg [527/819] 515.png on 00000217_(6).jpg → 515_bg.jpg [528/819] 516.png on 00000087_(2).jpg → 516_bg.jpg [529/819] 517.png on 00000015_(4).jpg → 517_bg.jpg [530/819] 518.png on 00000021_(7).jpg → 518_bg.jpg [531/819] 519.png on 00000295_(4).jpg → 519_bg.jpg [532/819] 52.png on 00000220_(6).jpg → 52_bg.jpg [533/819] 520.png on 00000122_(3).jpg → 520_bg.jpg [534/819] 521.png on 00000073_(5).jpg → 521_bg.jpg [535/819] 521f.png on 00000056_(3).jpg → 521f_bg.jpg [536/819] 522.png on 00000069_(2).jpg → 522_bg.jpg [537/819] 523.png on 00000005_(3).jpg → 523_bg.jpg [538/819] 524.png on 00000153_(6).jpg → 524_bg.jpg [539/819] 525.png on 00000068_(7).jpg → 525_bg.jpg [540/819] 526.png on 00000295_(3).jpg → 526_bg.jpg [541/819] 527.png on 00000157_(6).jpg → 527_bg.jpg [542/819] 528.png on 00000060_(3).jpg → 528_bg.jpg [543/819] 529.png on 00000292_(2).jpg → 529_bg.jpg [544/819] 53.png on 00000234_(3).jpg → 53_bg.jpg [545/819] 530.png on 00000220.jpg → 530_bg.jpg [546/819] 531-mega.png on 00000177_(5).jpg → 531-mega_bg.jpg [547/819] 531.png on 00000259_(2).jpg → 531_bg.jpg [548/819] 532.png on 00000257_(2).jpg → 532_bg.jpg [549/819] 533.png on 00000129_(4).jpg → 533_bg.jpg [550/819] 534.png on 00000227_(4).jpg → 534_bg.jpg [551/819] 535.png on 00000064_(3).jpg → 535_bg.jpg [552/819] 536.png on 00000254_(4).jpg → 536_bg.jpg [553/819] 537.png on 00000247_(3).jpg → 537_bg.jpg [554/819] 538.png on 00000030_(6).jpg → 538_bg.jpg [555/819] 539.png on 00000156_(6).jpg → 539_bg.jpg [556/819] 54.png on 00000092_(3).jpg → 54_bg.jpg [557/819] 540.png on 00000149_(6).jpg → 540_bg.jpg [558/819] 541.png on 00000013_(7).jpg → 541_bg.jpg [559/819] 542.png on 00000009.jpg → 542_bg.jpg [560/819] 543.png on 00000069_(6).jpg → 543_bg.jpg [561/819] 544.png on 00000227_(6).jpg → 544_bg.jpg [562/819] 545.png on 00000259_(4).jpg → 545_bg.jpg [563/819] 546.png on 00000167.jpg → 546_bg.jpg [564/819] 547.png on 00000032_(4).jpg → 547_bg.jpg [565/819] 548.png on 00000074_(3).jpg → 548_bg.jpg [566/819] 549.png on 00000190.jpg → 549_bg.jpg [567/819] 55.png on 00000214.jpg → 55_bg.jpg [568/819] 550-blue-striped.png on 00000016_(4).jpg → 550-blue-striped_bg.jpg [569/819] 550-red-striped.png on 00000194_(5).jpg → 550-red-striped_bg.jpg [570/819] 551.png on 00000022.jpg → 551_bg.jpg [571/819] 552.png on 00000170_(2).jpg → 552_bg.jpg [572/819] 553.png on 00000184_(6).jpg → 553_bg.jpg [573/819] 554.png on 00000159.jpg → 554_bg.jpg [574/819] 555-standard.png on 00000279_(5).jpg → 555-standard_bg.jpg [575/819] 556.png on 00000016_(4).jpg → 556_bg.jpg [576/819] 557.png on 00000169_(3).jpg → 557_bg.jpg [577/819] 558.png on 00000055_(3).jpg → 558_bg.jpg [578/819] 559.png on 00000299.jpg → 559_bg.jpg [579/819] 56.png on 00000254_(6).jpg → 56_bg.jpg [580/819] 560.png on 00000246_(3).jpg → 560_bg.jpg [581/819] 561.png on 00000299_(4).jpg → 561_bg.jpg [582/819] 562.png on 00000106_(4).jpg → 562_bg.jpg [583/819] 563.png on 00000296_(3).jpg → 563_bg.jpg [584/819] 564.png on 00000127_(3).jpg → 564_bg.jpg [585/819] 565.png on 00000288_(4).jpg → 565_bg.jpg [586/819] 566.png on 00000198_(6).jpg → 566_bg.jpg [587/819] 567.png on 00000107_(5).jpg → 567_bg.jpg [588/819] 568.png on 00000262_(4).jpg → 568_bg.jpg [589/819] 569.png on 00000099_(5).jpg → 569_bg.jpg [590/819] 57.png on 00000195.jpg → 57_bg.jpg [591/819] 570.png on 00000180_(2).jpg → 570_bg.jpg [592/819] 571.png on 00000127_(4).jpg → 571_bg.jpg [593/819] 572.png on 00000031_(5).jpg → 572_bg.jpg [594/819] 573.png on 00000123_(4).jpg → 573_bg.jpg [595/819] 574.png on 00000089_(4).jpg → 574_bg.jpg [596/819] 575.png on 00000289_(6).jpg → 575_bg.jpg [597/819] 576.png on 00000257_(2).jpg → 576_bg.jpg [598/819] 577.png on 00000068_(5).jpg → 577_bg.jpg [599/819] 578.png on 00000126_(3).jpg → 578_bg.jpg [600/819] 579.png on 00000081.jpg → 579_bg.jpg [601/819] 58.png on 00000220_(3).jpg → 58_bg.jpg [602/819] 580.png on 00000035.jpg → 580_bg.jpg [603/819] 581.png on 00000297_(6).jpg → 581_bg.jpg [604/819] 582.png on 00000183_(7).jpg → 582_bg.jpg [605/819] 583.png on 00000295_(3).jpg → 583_bg.jpg [606/819] 584.png on 00000288_(5).jpg → 584_bg.jpg [607/819] 585-autumn.png on 00000109.jpg → 585-autumn_bg.jpg [608/819] 585-spring.png on 00000261_(5).jpg → 585-spring_bg.jpg [609/819] 585-summer.png on 00000196_(6).jpg → 585-summer_bg.jpg [610/819] 585-winter.png on 00000115_(3).jpg → 585-winter_bg.jpg [611/819] 586-autumn.png on 00000257_(4).jpg → 586-autumn_bg.jpg [612/819] 586-spring.png on 00000284_(3).jpg → 586-spring_bg.jpg [613/819] 586-summer.png on 00000226_(3).jpg → 586-summer_bg.jpg [614/819] 586-winter.png on 00000281_(3).jpg → 586-winter_bg.jpg [615/819] 587.png on 00000029.jpg → 587_bg.jpg [616/819] 588.png on 00000220_(3).jpg → 588_bg.jpg [617/819] 589.png on 00000254_(3).jpg → 589_bg.jpg [618/819] 59.png on 00000016_(2).jpg → 59_bg.jpg [619/819] 590.png on 00000233.jpg → 590_bg.jpg [620/819] 591.png on 00000070_(5).jpg → 591_bg.jpg [621/819] 592.png on 00000118_(5).jpg → 592_bg.jpg [622/819] 592f.png on 00000030_(4).jpg → 592f_bg.jpg [623/819] 593.png on 00000102_(5).jpg → 593_bg.jpg [624/819] 593f.png on 00000022_(3).jpg → 593f_bg.jpg [625/819] 594.png on 00000143_(3).jpg → 594_bg.jpg [626/819] 595.png on 00000295_(2).jpg → 595_bg.jpg [627/819] 596.png on 00000010_(6).jpg → 596_bg.jpg [628/819] 597.png on 00000079_(4).jpg → 597_bg.jpg [629/819] 598.png on 00000303_(4).jpg → 598_bg.jpg [630/819] 599.png on 00000232_(3).jpg → 599_bg.jpg [631/819] 6-mega-x.png on 00000133_(3).jpg → 6-mega-x_bg.jpg [632/819] 6-mega-y.png on 00000175_(3).jpg → 6-mega-y_bg.jpg [633/819] 6.png on 00000145_(5).jpg → 6_bg.jpg [634/819] 60.png on 00000209_(6).jpg → 60_bg.jpg [635/819] 600.png on 00000286_(4).jpg → 600_bg.jpg [636/819] 601.png on 00000139_(6).jpg → 601_bg.jpg [637/819] 602.png on 00000076_(4).jpg → 602_bg.jpg [638/819] 603.png on 00000189_(6).jpg → 603_bg.jpg [639/819] 604.png on 00000052.jpg → 604_bg.jpg [640/819] 605.png on 00000024_(2).jpg → 605_bg.jpg [641/819] 606.png on 00000125_(6).jpg → 606_bg.jpg [642/819] 607.png on 00000290_(4).jpg → 607_bg.jpg [643/819] 608.png on 00000273_(5).jpg → 608_bg.jpg [644/819] 609.png on 00000074.jpg → 609_bg.jpg [645/819] 61.png on 00000033_(4).jpg → 61_bg.jpg [646/819] 610.png on 00000171_(6).jpg → 610_bg.jpg [647/819] 611.png on 00000254_(3).jpg → 611_bg.jpg [648/819] 612.png on 00000161_(6).jpg → 612_bg.jpg [649/819] 613.png on 00000141.jpg → 613_bg.jpg [650/819] 614.png on 00000128_(3).jpg → 614_bg.jpg [651/819] 615.png on 00000032_(2).jpg → 615_bg.jpg [652/819] 616.png on 00000286_(5).jpg → 616_bg.jpg [653/819] 617.png on 00000232_(2).jpg → 617_bg.jpg [654/819] 618.png on 00000164_(2).jpg → 618_bg.jpg [655/819] 619.png on 00000102_(6).jpg → 619_bg.jpg [656/819] 62.png on 00000214_(3).jpg → 62_bg.jpg [657/819] 620.png on 00000178_(3).jpg → 620_bg.jpg [658/819] 621.png on 00000189.jpg → 621_bg.jpg [659/819] 622.png on 00000258_(5).jpg → 622_bg.jpg [660/819] 623.png on 00000123_(6).jpg → 623_bg.jpg [661/819] 624.png on 00000040.jpg → 624_bg.jpg [662/819] 625.png on 00000054_(7).jpg → 625_bg.jpg [663/819] 626.png on 00000272_(3).jpg → 626_bg.jpg [664/819] 627.png on 00000013_(3).jpg → 627_bg.jpg [665/819] 628.png on 00000213_(6).jpg → 628_bg.jpg [666/819] 629.png on 00000126_(4).jpg → 629_bg.jpg [667/819] 63.png on 00000122.jpg → 63_bg.jpg [668/819] 630.png on 00000086_(5).jpg → 630_bg.jpg [669/819] 631.png on 00000209_(3).jpg → 631_bg.jpg [670/819] 632.png on 00000218_(3).jpg → 632_bg.jpg [671/819] 633.png on 00000057_(4).jpg → 633_bg.jpg [672/819] 634.png on 00000227_(5).jpg → 634_bg.jpg [673/819] 635.png on 00000112_(5).jpg → 635_bg.jpg [674/819] 636.png on 00000214.jpg → 636_bg.jpg [675/819] 637.png on 00000007_(4).jpg → 637_bg.jpg [676/819] 638.png on 00000252_(2).jpg → 638_bg.jpg [677/819] 639.png on 00000045_(5).jpg → 639_bg.jpg [678/819] 64.png on 00000151.jpg → 64_bg.jpg [679/819] 640.png on 00000299_(6).jpg → 640_bg.jpg [680/819] 641-incarnate.png on 00000171.jpg → 641-incarnate_bg.jpg [681/819] 641-therian.png on 00000087_(5).jpg → 641-therian_bg.jpg [682/819] 642-incarnate.png on 00000057.jpg → 642-incarnate_bg.jpg [683/819] 642-therian.png on 00000046_(2).jpg → 642-therian_bg.jpg [684/819] 643.png on 00000070_(6).jpg → 643_bg.jpg [685/819] 644.png on 00000203_(2).jpg → 644_bg.jpg [686/819] 645-incarnate.png on 00000002.jpg → 645-incarnate_bg.jpg [687/819] 645-therian.png on 00000291_(2).jpg → 645-therian_bg.jpg [688/819] 646-black.png on 00000012_(4).jpg → 646-black_bg.jpg [689/819] 646-white.png on 00000020_(2).jpg → 646-white_bg.jpg [690/819] 646.png on 00000227_(2).jpg → 646_bg.jpg [691/819] 647-ordinary.png on 00000297_(3).jpg → 647-ordinary_bg.jpg [692/819] 647-resolute.png on 00000137.jpg → 647-resolute_bg.jpg [693/819] 648-pirouette.png on 00000159_(2).jpg → 648-pirouette_bg.jpg [694/819] 648.png on 00000085.jpg → 648_bg.jpg [695/819] 649.png on 00000051.jpg → 649_bg.jpg [696/819] 65-mega.png on 00000162_(2).jpg → 65-mega_bg.jpg [697/819] 65.png on 00000154_(5).jpg → 65_bg.jpg [698/819] 650.png on 00000072_(3).jpg → 650_bg.jpg [699/819] 651.png on 00000049_(5).jpg → 651_bg.jpg [700/819] 652.png on 00000234_(3).jpg → 652_bg.jpg [701/819] 653.png on 00000079_(7).jpg → 653_bg.jpg [702/819] 654.png on 00000271.jpg → 654_bg.jpg [703/819] 655.png on 00000030_(7).jpg → 655_bg.jpg [704/819] 656.png on 00000109_(6).jpg → 656_bg.jpg [705/819] 657.png on 00000031_(5).jpg → 657_bg.jpg [706/819] 658.png on 00000124_(5).jpg → 658_bg.jpg [707/819] 659.png on 00000113_(4).jpg → 659_bg.jpg [708/819] 66.png on 00000223.jpg → 66_bg.jpg [709/819] 660.png on 00000064_(3).jpg → 660_bg.jpg [710/819] 661.png on 00000292.jpg → 661_bg.jpg [711/819] 662.png on 00000065_(5).jpg → 662_bg.jpg [712/819] 663.png on 00000167.jpg → 663_bg.jpg [713/819] 664.png on 00000242_(2).jpg → 664_bg.jpg [714/819] 665.png on 00000078_(4).jpg → 665_bg.jpg [715/819] 666-elegant.png on 00000183_(6).jpg → 666-elegant_bg.jpg [716/819] 666.png on 00000236_(4).jpg → 666_bg.jpg [717/819] 667.png on 00000184_(6).jpg → 667_bg.jpg [718/819] 668.png on 00000022_(7).jpg → 668_bg.jpg [719/819] 668f.png on 00000291_(2).jpg → 668f_bg.jpg [720/819] 669.png on 00000258_(3).jpg → 669_bg.jpg [721/819] 67.png on 00000137.jpg → 67_bg.jpg [722/819] 670.png on 00000043_(3).jpg → 670_bg.jpg [723/819] 671.png on 00000152_(2).jpg → 671_bg.jpg [724/819] 672.png on 00000004_(2).jpg → 672_bg.jpg [725/819] 673.png on 00000196_(4).jpg → 673_bg.jpg [726/819] 674.png on 00000282_(4).jpg → 674_bg.jpg [727/819] 675.png on 00000209.jpg → 675_bg.jpg [728/819] 676-diamond.png on 00000089.jpg → 676-diamond_bg.jpg [729/819] 676-heart.png on 00000227_(2).jpg → 676-heart_bg.jpg [730/819] 676-star.png on 00000253_(3).jpg → 676-star_bg.jpg [731/819] 676.png on 00000005_(6).jpg → 676_bg.jpg [732/819] 677.png on 00000125_(3).jpg → 677_bg.jpg [733/819] 678.png on 00000003_(5).jpg → 678_bg.jpg [734/819] 678f.png on 00000224_(4).jpg → 678f_bg.jpg [735/819] 679.png on 00000082_(3).jpg → 679_bg.jpg [736/819] 68.png on 00000080_(3).jpg → 68_bg.jpg [737/819] 680.png on 00000105_(4).jpg → 680_bg.jpg [738/819] 681-blade.png on 00000220_(6).jpg → 681-blade_bg.jpg [739/819] 681-shield.png on 00000158_(5).jpg → 681-shield_bg.jpg [740/819] 681.png on 00000196_(2).jpg → 681_bg.jpg [741/819] 682.png on 00000165_(5).jpg → 682_bg.jpg [742/819] 683.png on 00000168_(2).jpg → 683_bg.jpg [743/819] 684.png on 00000001_(7).jpg → 684_bg.jpg [744/819] 685.png on 00000191_(6).jpg → 685_bg.jpg [745/819] 686.png on 00000167_(2).jpg → 686_bg.jpg [746/819] 687.png on 00000141_(3).jpg → 687_bg.jpg [747/819] 688.png on 00000229_(5).jpg → 688_bg.jpg [748/819] 689.png on 00000035_(3).jpg → 689_bg.jpg [749/819] 69.png on 00000095_(3).jpg → 69_bg.jpg [750/819] 690.png on 00000115_(4).jpg → 690_bg.jpg [751/819] 691.png on 00000089_(6).jpg → 691_bg.jpg [752/819] 692.png on 00000240_(4).jpg → 692_bg.jpg [753/819] 693.png on 00000232_(6).jpg → 693_bg.jpg [754/819] 694.png on 00000110_(5).jpg → 694_bg.jpg [755/819] 695.png on 00000170_(5).jpg → 695_bg.jpg [756/819] 696.png on 00000211_(6).jpg → 696_bg.jpg [757/819] 697.png on 00000286_(3).jpg → 697_bg.jpg [758/819] 698.png on 00000212_(4).jpg → 698_bg.jpg [759/819] 699.png on 00000017_(3).jpg → 699_bg.jpg [760/819] 7.png on 00000077.jpg → 7_bg.jpg [761/819] 70.png on 00000131_(6).jpg → 70_bg.jpg [762/819] 700.png on 00000236_(5).jpg → 700_bg.jpg [763/819] 701.png on 00000210_(2).jpg → 701_bg.jpg [764/819] 702.png on 00000143_(2).jpg → 702_bg.jpg [765/819] 703.png on 00000052_(6).jpg → 703_bg.jpg [766/819] 704.png on 00000158_(6).jpg → 704_bg.jpg [767/819] 705.png on 00000188_(4).jpg → 705_bg.jpg [768/819] 706.png on 00000199_(5).jpg → 706_bg.jpg [769/819] 707.png on 00000279_(2).jpg → 707_bg.jpg [770/819] 708.png on 00000255_(2).jpg → 708_bg.jpg [771/819] 709.png on 00000095_(5).jpg → 709_bg.jpg [772/819] 71.png on 00000102_(5).jpg → 71_bg.jpg [773/819] 710.png on 00000286_(6).jpg → 710_bg.jpg [774/819] 711.png on 00000295_(3).jpg → 711_bg.jpg [775/819] 712.png on 00000013_(3).jpg → 712_bg.jpg [776/819] 713.png on 00000026_(7).jpg → 713_bg.jpg [777/819] 714.png on 00000016.jpg → 714_bg.jpg [778/819] 715.png on 00000149.jpg → 715_bg.jpg [779/819] 716.png on 00000003_(6).jpg → 716_bg.jpg [780/819] 717.png on 00000203.jpg → 717_bg.jpg [781/819] 718.png on 00000248.jpg → 718_bg.jpg [782/819] 719-mega.png on 00000031_(4).jpg → 719-mega_bg.jpg [783/819] 719.png on 00000053_(6).jpg → 719_bg.jpg [784/819] 72.png on 00000235_(5).jpg → 72_bg.jpg [785/819] 720-unbound.png on 00000049_(6).jpg → 720-unbound_bg.jpg [786/819] 720.png on 00000155_(5).jpg → 720_bg.jpg [787/819] 721.png on 00000128_(5).jpg → 721_bg.jpg [788/819] 73.png on 00000132_(6).jpg → 73_bg.jpg [789/819] 74.png on 00000222_(2).jpg → 74_bg.jpg [790/819] 75.png on 00000033_(7).jpg → 75_bg.jpg [791/819] 76.png on 00000014_(4).jpg → 76_bg.jpg [792/819] 77.png on 00000113.jpg → 77_bg.jpg [793/819] 78.png on 00000222_(5).jpg → 78_bg.jpg [794/819] 79.png on 00000267_(2).jpg → 79_bg.jpg [795/819] 8.png on 00000168_(2).jpg → 8_bg.jpg [796/819] 80-mega.png on 00000287_(4).jpg → 80-mega_bg.jpg [797/819] 80.png on 00000083_(2).jpg → 80_bg.jpg [798/819] 81.png on 00000121_(7).jpg → 81_bg.jpg [799/819] 82.png on 00000144_(2).jpg → 82_bg.jpg [800/819] 83.png on 00000180_(6).jpg → 83_bg.jpg [801/819] 84.png on 00000153_(3).jpg → 84_bg.jpg [802/819] 85.png on 00000261_(4).jpg → 85_bg.jpg [803/819] 86.png on 00000000_(7).jpg → 86_bg.jpg [804/819] 87.png on 00000063_(4).jpg → 87_bg.jpg [805/819] 88.png on 00000143.jpg → 88_bg.jpg [806/819] 89.png on 00000134_(2).jpg → 89_bg.jpg [807/819] 9-mega.png on 00000132_(2).jpg → 9-mega_bg.jpg [808/819] 9.png on 00000018_(3).jpg → 9_bg.jpg [809/819] 90.png on 00000266_(5).jpg → 90_bg.jpg [810/819] 91.png on 00000124_(3).jpg → 91_bg.jpg [811/819] 92.png on 00000079_(4).jpg → 92_bg.jpg [812/819] 93.png on 00000272_(5).jpg → 93_bg.jpg [813/819] 94-mega.png on 00000014_(2).jpg → 94-mega_bg.jpg [814/819] 94.png on 00000259_(6).jpg → 94_bg.jpg [815/819] 95.png on 00000137.jpg → 95_bg.jpg [816/819] 96.png on 00000053.jpg → 96_bg.jpg [817/819] 97.png on 00000282_(5).jpg → 97_bg.jpg [818/819] 98.png on 00000064.jpg → 98_bg.jpg [819/819] 99.png on 00000281_(6).jpg → 99_bg.jpg
Resizing Images¶
In [3]:
# File Directory holding all of the files for this project
INPUT_ROOT = r""
# Specific folders holder the training and testing images
SPLITS = [
"pokemon_train",
"pokemon_test",
"animals_train",
"animals_test",
]
TARGET_SIZE = (224, 224)
# Ensures that all images are the same size so the model doesn't learn if it is a pokemon or not based on image size
def batch_resize_inplace():
for split in SPLITS:
dirpath = os.path.join(INPUT_ROOT, split)
files = [f for f in os.listdir(dirpath)
if f.lower().endswith((".jpg", ".jpeg", ".png"))]
print(f"Resizing {len(files)} images in {split}/ (in-place)...")
for fname in files:
path = os.path.join(dirpath, fname)
with Image.open(path) as img:
img = img.convert("RGB")
img = img.resize(TARGET_SIZE, Image.LANCZOS)
new_path = os.path.splitext(path)[0] + ".jpg"
img.save(new_path, "JPEG", quality=90)
if path.lower().endswith(".png"):
os.remove(path)
print(f" → Done {split}\n")
if __name__ == "__main__":
batch_resize_inplace()
Resizing 655 images in pokemon_train/ (in-place)... → Done pokemon_train Resizing 164 images in pokemon_test/ (in-place)... → Done pokemon_test Resizing 655 images in animals_train/ (in-place)... → Done animals_train Resizing 164 images in animals_test/ (in-place)... → Done animals_test
Binary MLPClassifier: Pokemon vs Non-Pokemon¶
In [ ]:
# Folder Directories
DATA_ROOT = r"C:\Users\jacko\Desktop\DAT494\FinalProject"
POKE_TRAIN_DIR = "pokemon_train"
ANIM_TRAIN_DIR = "animals_train"
POKE_TEST_DIR = "pokemon_test"
ANIM_TEST_DIR = "animals_test"
# Lets the code know if there is an image that wasn't sized properly
IMG_SIZE = (224,224)
# Batch sizes
BATCH_SIZE = 256
# Number of layers to not overr or under fit the model
HIDDEN_LAYERS = [32,32,32]
# Ensure random state for repeatability
RANDOM_STATE = 42
# This function builds my feature matrix and target vectors and ensures image size
def load_and_flatten(folder, label):
X, y, paths = [], [], []
for fname in sorted(os.listdir(folder)):
if not fname.lower().endswith((".jpg", ".jpeg", ".png")):
continue
path = os.path.join(folder, fname)
img = Image.open(path).convert("RGB")
if img.size != IMG_SIZE:
raise ValueError(f"{path} is size {img.size}, expected {IMG_SIZE}")
arr = np.asarray(img, dtype=np.float32) / 255.0
X.append(arr.ravel())
y.append(label)
paths.append(path)
return np.vstack(X), np.array(y, dtype = np.int64), paths
# Assembles my full training datasets
x_poke_train, y_poke_train, _ = load_and_flatten(os.path.join(DATA_ROOT, POKE_TRAIN_DIR), 1)
x_anim_train, y_anim_train, _ = load_and_flatten(os.path.join(DATA_ROOT, ANIM_TRAIN_DIR), 0)
X_train = np.vstack([x_poke_train, x_anim_train])
y_train = np.concatenate([y_poke_train, y_anim_train])
# Assembles my full testing datasets
x_poke_test, y_poke_test, paths_poke_test = load_and_flatten(os.path.join(DATA_ROOT, POKE_TEST_DIR), 1)
x_anim_test, y_anim_test, paths_anim_test = load_and_flatten(os.path.join(DATA_ROOT, ANIM_TEST_DIR), 0)
X_test = np.vstack([x_poke_test, x_anim_test])
y_test = np.concatenate([y_poke_test, y_anim_test])
test_paths = paths_poke_test + paths_anim_test
# Shows the training and testing shapes to ensure it separated and counted correctly
print(f"Train: X = {X_train.shape}, y = {y_train.shape}")
print(f"Test: X = {X_test.shape}, y = {y_test.shape}")
print(f"Train samples: {X_train.shape[0]}, Test samples: {X_test.shape[0]}")
# Counts and captures max iterations, accuracy scores, and losses
max_iters = list(range(1, 11))
accuracies = []
loss = []
# Loop for running through 1-10 max iterations and grabbing
for mi in max_iters:
mlp_clf = MLPClassifier(
hidden_layer_sizes = HIDDEN_LAYERS,
activation = "relu",
alpha = 0,
max_iter = mi,
batch_size = BATCH_SIZE,
random_state = RANDOM_STATE,
warm_start = False
)
# Fits the training set to the MLPClassifier
print("Fitting MLPClassifier on binary labels...")
mlp_clf.fit(X_train, y_train)
# Runs testing and outputs accuracy and loss
y_pred = mlp_clf.predict(X_test)
acc = accuracy_score(y_test, y_pred)
accuracies.append(acc)
loss.append(mlp_clf.loss_)
cm = confusion_matrix(y_test, y_pred, labels = [0,1])
print(f"max_iter = {mi:2d} -> Test Accuracy = {acc:.4f}, Loss = {mlp_clf.loss_:.4f}")
print(f"Confusion Matrix: \n{cm}")
# Accuracy Graph
plt.figure(figsize = (8,4))
plt.plot(max_iters, accuracies, marker = 'o')
plt.title("Test Accuracy vs max_iter (MLPClassifier)")
plt.xlabel("max_iter")
plt.ylabel("Test Accuracy")
plt.xticks(max_iters)
plt.grid(True)
plt.show()
# Loss Graph
plt.figure(figsize = (8,4))
plt.plot(max_iters, loss, marker = 'o', color = 'red')
plt.title("Training Loss vs max_iter (MLPClassifier)")
plt.xlabel("max_iter")
plt.ylabel("Training Loss")
plt.xticks(max_iters)
plt.grid(True)
plt.show()
Train: X = (1310, 150528), y = (1310,) Test: X = (328, 150528), y = (328,) Train samples: 1310, Test samples: 328 Fitting MLPClassifier on binary labels...
C:\Users\jacko\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\sklearn\neural_network\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (1) reached and the optimization hasn't converged yet. warnings.warn(
max_iter = 1 -> Test Accuracy = 0.5000, Loss = 4.7938 Confusion Matrix: [[164 0] [164 0]] Fitting MLPClassifier on binary labels...
C:\Users\jacko\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\sklearn\neural_network\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (2) reached and the optimization hasn't converged yet. warnings.warn(
max_iter = 2 -> Test Accuracy = 0.5701, Loss = 3.2660 Confusion Matrix: [[ 30 134] [ 7 157]] Fitting MLPClassifier on binary labels...
C:\Users\jacko\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\sklearn\neural_network\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (3) reached and the optimization hasn't converged yet. warnings.warn(
max_iter = 3 -> Test Accuracy = 0.6189, Loss = 0.6316 Confusion Matrix: [[156 8] [117 47]] Fitting MLPClassifier on binary labels...
C:\Users\jacko\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\sklearn\neural_network\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (4) reached and the optimization hasn't converged yet. warnings.warn(
max_iter = 4 -> Test Accuracy = 0.7043, Loss = 0.5829 Confusion Matrix: [[ 90 74] [ 23 141]] Fitting MLPClassifier on binary labels...
C:\Users\jacko\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\sklearn\neural_network\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (5) reached and the optimization hasn't converged yet. warnings.warn(
max_iter = 5 -> Test Accuracy = 0.7500, Loss = 0.9633 Confusion Matrix: [[135 29] [ 53 111]] Fitting MLPClassifier on binary labels...
C:\Users\jacko\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\sklearn\neural_network\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (6) reached and the optimization hasn't converged yet. warnings.warn(
max_iter = 6 -> Test Accuracy = 0.5701, Loss = 0.7696 Confusion Matrix: [[ 26 138] [ 3 161]] Fitting MLPClassifier on binary labels...
C:\Users\jacko\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\sklearn\neural_network\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (7) reached and the optimization hasn't converged yet. warnings.warn(
max_iter = 7 -> Test Accuracy = 0.7713, Loss = 0.4121 Confusion Matrix: [[129 35] [ 40 124]] Fitting MLPClassifier on binary labels...
C:\Users\jacko\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\sklearn\neural_network\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (8) reached and the optimization hasn't converged yet. warnings.warn(
max_iter = 8 -> Test Accuracy = 0.7683, Loss = 0.4361 Confusion Matrix: [[101 63] [ 13 151]] Fitting MLPClassifier on binary labels...
C:\Users\jacko\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\sklearn\neural_network\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (9) reached and the optimization hasn't converged yet. warnings.warn(
max_iter = 9 -> Test Accuracy = 0.7835, Loss = 0.6569 Confusion Matrix: [[138 26] [ 45 119]] Fitting MLPClassifier on binary labels... max_iter = 10 -> Test Accuracy = 0.7805, Loss = 0.4468 Confusion Matrix: [[132 32] [ 40 124]]
C:\Users\jacko\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\sklearn\neural_network\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (10) reached and the optimization hasn't converged yet. warnings.warn(
In [4]:
# Confusion Matrix
import seaborn as sns
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
# Step 2: Create the confusion matrix
cm = confusion_matrix(y_test, y_pred, labels=[0, 1])
# Step 3: Plot the confusion matrix using seaborn heatmap
plt.figure(figsize=(6, 5))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=['Animal', 'Pokémon'], yticklabels=['Animal', 'Pokémon'])
plt.xlabel("Predicted Label")
plt.ylabel("True Label")
plt.title("Confusion Matrix: Pokémon vs Animal Classifier")
plt.tight_layout()
plt.show()
In [5]:
# Identify the best hyperparameter setting based on validation accuracy
best_idx = int(np.argmax(accuracies)) # Index of best-performing model
best_iter = max_iters[best_idx] # Corresponding number of iterations
print(f"Best max_iter = {best_iter}, Test Accuracy = {accuracies[best_idx]:.4f}")
# Rebuild the classifier using the best number of iterations
best_clf = MLPClassifier(
hidden_layer_sizes=HIDDEN_LAYERS,
activation="relu",
alpha=0,
max_iter=best_iter,
batch_size=BATCH_SIZE,
random_state=RANDOM_STATE,
warm_start=False
)
# Fit the best model to the full training set
best_clf.fit(X_train, y_train)
# Predict labels on the test set
y_pred_best = best_clf.predict(X_test)
# Categorize predictions for analysis and visualization
categories = {
"True Positives (Pokemon -> Pokemon)": [
(p, yt, yp) for p, yt, yp in zip(test_paths, y_test, y_pred_best) if yt == 1 and yp == 1
],
"False Positives (Animal -> Pokemon)": [
(p, yt, yp) for p, yt, yp in zip(test_paths, y_test, y_pred_best) if yt == 0 and yp == 1
],
"False Negatives (Pokemon -> Animal)": [
(p, yt, yp) for p, yt, yp in zip(test_paths, y_test, y_pred_best) if yt == 1 and yp == 0
],
"True Negatives (Animal -> Animal)": [
(p, yt, yp) for p, yt, yp in zip(test_paths, y_test, y_pred_best) if yt == 0 and yp == 0
],
}
# Function to display sample images from each category
# Inputs:
# - title: category name (e.g., "True Positives")
# - items: list of (image path, true label, predicted label)
# - max_samples: number of images to show (default: 9)
def plot_samples(title, items, max_samples=9):
n = min(len(items), max_samples)
cols = 3
rows = (n + cols - 1) // cols
fig, axes = plt.subplots(rows, cols, figsize=(cols * 3, rows * 3))
axes = axes.flatten()
# Display each selected image with its labels
for ax, (path, yt, yp) in zip(axes, items[:n]):
img = Image.open(path).convert("RGB")
ax.imshow(img)
ax.set_title(f"true = {yt}, pred = {yp}")
ax.axis("off")
# Hide unused subplot axes
for ax in axes[n:]:
ax.axis("off")
# Add overall title
fig.suptitle(title, fontsize=14)
plt.tight_layout()
plt.show()
# Visualize predictions in each category (TP, FP, FN, TN)
for title, items in categories.items():
plot_samples(title, items)
Best max_iter = 9, Test Accuracy = 0.7835
C:\Users\jacko\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\sklearn\neural_network\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (9) reached and the optimization hasn't converged yet. warnings.warn(
In [ ]: